பைதான் gzip: திறமையான ஸ்ட்ரீம் சுருக்கம், நீக்குதல். தரவுப் பரிமாற்றம், சேமிப்பக மேம்பாட்டிற்கான நுட்பங்கள், உலகளாவிய பயன்பாடுகளை அறிக.
பைதான் Gzip சுருக்கம்: உலகளாவிய பயன்பாடுகளுக்கான ஸ்ட்ரீம் சுருக்கம் மற்றும் நீக்குதலைக் கற்றுக்கொள்வது
இன்றைய தரவு சார்ந்த உலகில், திறமையான தரவு கையாளுதல் மிகவும் முக்கியமானது. நீங்கள் கண்டங்கள் முழுவதும் முக்கியமான தகவல்களைப் பரிமாற்றினாலும், பெரிய தரவுத்தொகுப்புகளைச் சேமித்தாலும் அல்லது பயன்பாட்டின் செயல்திறனை மேம்படுத்தினாலும், சுருக்கம் ஒரு முக்கியப் பங்கை வகிக்கிறது. பைதான், அதன் செழுமையான நிலையான நூலகத்துடன், அதன் gzip
தொகுதி மூலம் சுருக்கப்பட்ட தரவுகளைக் கையாளுவதற்கான சக்திவாய்ந்த மற்றும் நேரடியான தீர்வை வழங்குகிறது. இந்தக் கட்டுரை பைதானின் gzip
தொகுதி, குறிப்பாக ஸ்ட்ரீம் சுருக்கம் மற்றும் நீக்குதல் ஆகியவற்றைப் பற்றி ஆழமாக ஆராய்ந்து, நடைமுறை எடுத்துக்காட்டுகளை வழங்குவதோடு, உலகளாவிய பயன்பாடுகளுக்கான அதன் முக்கியத்துவத்தையும் எடுத்துக்காட்டுகிறது.
Gzip சுருக்கத்தைப் புரிந்துகொள்வது
Gzip என்பது இழப்பில்லாத தரவுச் சுருக்கத்திற்குப் பயன்படுத்தப்படும் பரவலாக ஏற்றுக்கொள்ளப்பட்ட கோப்பு வடிவம் மற்றும் மென்பொருள் பயன்பாடு ஆகும். ஜீன்-லூப் கெய்லி மற்றும் மார்க் ஆட்லர் ஆகியோரால் உருவாக்கப்பட்டது, இது DEFLATE அல்காரிதத்தை அடிப்படையாகக் கொண்டது, இது LZ77 அல்காரிதம் மற்றும் ஹஃப்மேன் குறியாக்கத்தின் கலவையாகும். gzip-இன் முதன்மை நோக்கம் கோப்புகளின் அளவைக் குறைப்பதாகும், இதன் மூலம் சேமிப்பக இடத்தை குறைத்து, நெட்வொர்க்குகள் வழியாக தரவுப் பரிமாற்றத்தை விரைவுபடுத்துகிறது.
Gzip-இன் முக்கிய அம்சங்கள்:
- இழப்பில்லாத சுருக்கம்: சுருக்க மற்றும் நீக்குதல் செயல்பாட்டின் போது எந்தத் தரவும் இழக்கப்படாமல் Gzip உறுதி செய்கிறது. அசல் தரவை சுருக்கப்பட்ட பதிப்பிலிருந்து சரியாக மீண்டும் உருவாக்க முடியும்.
- அனைத்து இடங்களிலும் ஆதரவு: Gzip பெரும்பாலான யூனிக்ஸ் போன்ற இயக்க முறைமைகளில் ஒரு தரநிலையாகும், மேலும் பல இணைய சேவையகங்கள் மற்றும் உலாவிகளால் ஆதரிக்கப்படுகிறது, இது இணைய உள்ளடக்க விநியோகத்திற்கு ஒரு சிறந்த தேர்வாக அமைகிறது.
- ஸ்ட்ரீம் சார்ந்த: Gzip தரவு ஸ்ட்ரீம்களுடன் செயல்பட வடிவமைக்கப்பட்டுள்ளது, அதாவது முழு தரவுத்தொகுப்பையும் நினைவகத்தில் ஏற்றத் தேவையில்லாமல், தரவு படிக்கப்படும்போது அல்லது எழுதப்படும்போது அதைச் சுருக்கலாம் அல்லது நீக்கலாம். இது பெரிய கோப்புகளுக்கு அல்லது நிகழ்நேர தரவுச் செயலாக்கத்திற்கு மிகவும் பயனுள்ளதாக இருக்கும்.
பைதான் gzip
தொகுதி: ஒரு மேலோட்டம்
பைதான் உள்ளமைக்கப்பட்ட gzip
தொகுதி Gzip வடிவத்தைப் பயன்படுத்தி கோப்புகளைச் சுருக்கவும் நீக்கவும் ஒரு வசதியான இடைமுகத்தை வழங்குகிறது. இது GNU zip பயன்பாட்டுடன் இணக்கமாக இருக்க வடிவமைக்கப்பட்டுள்ளது மற்றும் பைதான் நிலையான கோப்பு கையாளுதலில் காணப்படும் செயல்பாடுகளைப் பிரதிபலிக்கிறது. இது டெவலப்பர்கள் சுருக்கப்பட்ட கோப்புகளை வழக்கமான கோப்புகளைப் போலவே கையாள அனுமதிக்கிறது, இதனால் சுருக்கத்தை அவர்களின் பயன்பாடுகளில் ஒருங்கிணைப்பதை எளிதாக்குகிறது.
gzip
தொகுதி பல முக்கிய வகுப்புகள் மற்றும் செயல்பாடுகளை வழங்குகிறது:
gzip.GzipFile
: இந்த வகுப்பு ஒரு கோப்பு பொருளை ஒத்த ஒரு இடைமுகத்தை வழங்குகிறது, இது gzip-சுருக்கப்பட்ட கோப்புகளிலிருந்து படிக்கவும் எழுதவும் உங்களை அனுமதிக்கிறது.gzip.open()
: பைதான் உள்ளமைக்கப்பட்டopen()
செயல்பாட்டைப் போலவே, ஒரு gzip-சுருக்கப்பட்ட கோப்பை பைனரி அல்லது உரை முறையில் திறக்கும் ஒரு வசதியான செயல்பாடு.gzip.compress()
: ஒரு பைட் ஸ்ட்ரிங்கைச் சுருக்குவதற்கான ஒரு எளிய செயல்பாடு.gzip.decompress()
: ஒரு gzip-சுருக்கப்பட்ட பைட் ஸ்ட்ரிங்கை நீக்குவதற்கான ஒரு எளிய செயல்பாடு.
gzip.GzipFile
உடன் ஸ்ட்ரீம் சுருக்கம்
gzip
தொகுதியின் சக்தி தரவு ஸ்ட்ரீம்களைக் கையாளும் போது உண்மையாகவே வெளிப்படுகிறது. இது பெரிய அளவிலான தரவுகளைக் கையாளும் பயன்பாடுகளுக்கு, அதாவது லாக் செய்தல், தரவு காப்புப்பிரதி அல்லது நெட்வொர்க் தொடர்பு போன்றவற்றுக்கு மிகவும் பொருத்தமானது. gzip.GzipFile
ஐப் பயன்படுத்தி, தரவு உருவாக்கப்படும்போது அல்லது மற்றொரு மூலத்திலிருந்து படிக்கப்படும்போது அதைச் சுருக்கலாம்.
ஒரு கோப்பிற்கு தரவைச் சுருக்குதல்
ஒரு அடிப்படை உதாரணத்துடன் தொடங்குவோம்: ஒரு ஸ்ட்ரிங்கை ஒரு .gz
கோப்பாகச் சுருக்குவது. நாம் ஒரு GzipFile
பொருளை எழுத பைனரி முறையில் ('wb'
) திறப்போம்.
import gzip
import os
data_to_compress = b"This is a sample string that will be compressed using Python's gzip module. It's important to use bytes for compression."
file_name = "compressed_data.gz"
# Open the gzip file in write binary mode
with gzip.GzipFile(file_name, 'wb') as gz_file:
gz_file.write(data_to_compress)
print(f"Data successfully compressed to {file_name}")
# Verify file size (optional)
print(f"Original data size: {len(data_to_compress)} bytes")
print(f"Compressed file size: {os.path.getsize(file_name)} bytes")
இந்த எடுத்துக்காட்டில்:
- நாம்
gzip
தொகுதியை இறக்குமதி செய்கிறோம். - சுருக்கப்பட வேண்டிய தரவை ஒரு பைட் ஸ்ட்ரிங்காக (
b"..."
) வரையறுக்கிறோம். Gzip பைட்டுகளில் செயல்படுகிறது, ஸ்ட்ரிங்குகளில் அல்ல. - நாம் வெளியீட்டு கோப்பு பெயரை, பொதுவாக ஒரு
.gz
நீட்டிப்புடன் குறிப்பிடுகிறோம். with
கூற்றைப் பயன்படுத்துவதன் மூலம், பிழைகள் ஏற்பட்டாலும்GzipFile
சரியாக மூடப்படுவதை உறுதிசெய்கிறோம்.gz_file.write(data_to_compress)
சுருக்கப்பட்ட தரவை கோப்பிற்கு எழுதுகிறது.
சுருக்கப்பட்ட கோப்பின் அளவு அசல் தரவின் அளவை விட கணிசமாகக் குறைவாக இருப்பதைக் காண்பீர்கள், இது gzip சுருக்கத்தின் செயல்திறனை நிரூபிக்கிறது.
ஏற்கனவே உள்ள ஸ்ட்ரீமில் இருந்து தரவைச் சுருக்குதல்
ஒரு வழக்கமான கோப்பு அல்லது ஒரு நெட்வொர்க் சாக்கெட் போன்ற மற்றொரு மூலத்திலிருந்து தரவைச் சுருக்குவது ஒரு பொதுவான பயன்பாட்டு நிகழ்வாகும். gzip
தொகுதி இந்த ஸ்ட்ரீம்களுடன் தடையின்றி ஒருங்கிணைக்கிறது.
உங்களிடம் ஒரு பெரிய உரை கோப்பு (எ.கா., large_log.txt
) உள்ளது என்று கற்பனை செய்வோம், மேலும் முழு கோப்பையும் நினைவகத்தில் ஏற்றாமல் அதை நிகழ்நேரத்தில் சுருக்க விரும்புகிறீர்கள்.
import gzip
input_file_path = "large_log.txt"
output_file_path = "large_log.txt.gz"
# Assume large_log.txt exists and contains a lot of text
# For demonstration, let's create a dummy large file:
with open(input_file_path, "w") as f:
for i in range(100000):
f.write(f"This is line number {i+1}. Some repetitive text for compression. \n")
print(f"Created dummy input file: {input_file_path}")
try:
# Open the input file in read text mode
with open(input_file_path, 'rb') as f_in:
# Open the output gzip file in write binary mode
with gzip.GzipFile(output_file_path, 'wb') as f_out:
# Read data in chunks and write to the gzip file
while True:
chunk = f_in.read(4096) # Read in 4KB chunks
if not chunk:
break
f_out.write(chunk)
print(f"Successfully compressed {input_file_path} to {output_file_path}")
except FileNotFoundError:
print(f"Error: Input file {input_file_path} not found.")
except Exception as e:
print(f"An error occurred: {e}")
இங்கே:
- நாம் உள்ளீட்டு கோப்பை பைனரி முறையில் (
'rb'
) படிக்கிறோம், இது பைட்டுகளை எதிர்பார்க்கும் gzip-உடன் இணக்கத்தன்மையை உறுதி செய்கிறது. - நாம்
gzip.GzipFile
க்கு பைனரி முறையில் ('wb'
) எழுதுகிறோம். - தரவை துண்டு துண்டாகப் படிக்கவும் எழுதவும் ஒரு துண்டு பொறிமுறையை (
f_in.read(4096)
) பயன்படுத்துகிறோம். இது பெரிய கோப்புகளை திறமையாகக் கையாள்வதற்கும், நினைவகச் சோர்வைத் தடுப்பதற்கும் முக்கியமானது. 4096 பைட்டுகள் (4KB) ஒரு பொதுவான மற்றும் பயனுள்ள துண்டின் அளவு ஆகும்.
இந்த ஸ்ட்ரீமிங் அணுகுமுறை மிகவும் அளவிடக்கூடியது மற்றும் நினைவகத்தில் பொருந்தாத பெரிய தரவுத்தொகுப்புகளைச் செயலாக்குவதற்கு ஏற்றது.
ஒரு நெட்வொர்க் சாக்கெட்டிற்கு தரவைச் சுருக்குதல்
நெட்வொர்க் பயன்பாடுகளில், அமுக்கப்படாத தரவை அனுப்புவது அலைவரிசை வரம்புகள் மற்றும் அதிகரித்த தாமதம் காரணமாக திறமையற்றதாக இருக்கலாம். Gzip சுருக்கம் செயல்திறனை கணிசமாக மேம்படுத்தும். ஒரு சேவையகத்திலிருந்து ஒரு கிளையண்டிற்கு தரவை அனுப்புவதை கற்பனை செய்து பாருங்கள். சாக்கெட் வழியாக அனுப்புவதற்கு சற்று முன் தரவைச் சுருக்கலாம்.
இந்த எடுத்துக்காட்டு போலி சாக்கெட்டுகளைப் பயன்படுத்தி கருத்தை நிரூபிக்கிறது. ஒரு உண்மையான பயன்பாட்டில், உண்மையான நெட்வொர்க் சாக்கெட்டுகளுடன் தொடர்பு கொள்ள நீங்கள் socket
போன்ற நூலகங்கள் அல்லது Flask/Django போன்ற கட்டமைப்புகளைப் பயன்படுத்துவீர்கள்.
import gzip
import io
def compress_and_send(data_stream, socket):
# Create an in-memory binary stream (like a file)
compressed_stream = io.BytesIO()
# Wrap the in-memory stream with gzip.GzipFile
with gzip.GzipFile(fileobj=compressed_stream, mode='wb') as gz_writer:
# Write data from the input stream to the gzip writer
while True:
chunk = data_stream.read(4096) # Read in chunks
if not chunk:
break
gz_writer.write(chunk)
# Get the compressed bytes from the in-memory stream
compressed_data = compressed_stream.getvalue()
# In a real scenario, you would send compressed_data over the socket
print(f"Sending {len(compressed_data)} bytes of compressed data over socket...")
# socket.sendall(compressed_data) # Example: send over actual socket
# --- Mock setup for demonstration ---
# Simulate data coming from a source (e.g., a file or database query)
original_data_source = io.BytesIO(b"This is some data to be sent over the network. " * 10000)
# Mock socket object
class MockSocket:
def sendall(self, data):
print(f"Mock socket received {len(data)} bytes.")
mock_socket = MockSocket()
print("Starting compression and mock send...")
compress_and_send(original_data_source, mock_socket)
print("Mock send complete.")
இந்த சூழ்நிலையில்:
io.BytesIO
ஐப் பயன்படுத்தி கோப்பு போன்ற ஒரு நினைவக பைனரி ஸ்ட்ரீமை உருவாக்குகிறோம்.fileobj
வாதத்தைப் பயன்படுத்தி இந்த ஸ்ட்ரீமைgzip.GzipFile
க்கு அனுப்புகிறோம்.gzip.GzipFile
சுருக்கப்பட்ட தரவை எங்கள்io.BytesIO
பொருளில் எழுதுகிறது.- இறுதியாக,
compressed_stream.getvalue()
ஐப் பயன்படுத்தி சுருக்கப்பட்ட பைட்டுகளை மீட்டெடுக்கிறோம், பின்னர் அவற்றை ஒரு உண்மையான நெட்வொர்க் சாக்கெட் வழியாக அனுப்புவோம்.
இந்த முறை இணைய சேவையகங்கள் (Nginx அல்லது Apache போன்றவை, அவை HTTP மட்டத்தில் கையாளுகின்றன) மற்றும் தனிப்பயன் நெட்வொர்க் நெறிமுறைகளில் Gzip சுருக்கத்தைச் செயல்படுத்துவதற்கு அடிப்படையாகும்.
gzip.GzipFile
உடன் ஸ்ட்ரீம் நீக்குதல்
சுருக்கம் எவ்வளவு முக்கியமோ, அதேபோல நீக்குதலும் முக்கியம். gzip
தொகுதியும் ஸ்ட்ரீம்களிலிருந்து தரவை நீக்குவதற்கு நேரடியான முறைகளை வழங்குகிறது.
ஒரு கோப்பிலிருந்து தரவை நீக்குதல்
ஒரு .gz
கோப்பிலிருந்து தரவைப் படிக்க, நீங்கள் GzipFile
பொருளை பைனரி படிக்கும் முறையில் ('rb'
) திறக்கிறீர்கள்.
import gzip
import os
# Assuming 'compressed_data.gz' was created in the previous example
file_name = "compressed_data.gz"
if os.path.exists(file_name):
try:
# Open the gzip file in read binary mode
with gzip.GzipFile(file_name, 'rb') as gz_file:
decompressed_data = gz_file.read()
print(f"Data successfully decompressed from {file_name}")
print(f"Decompressed data: {decompressed_data.decode('utf-8')}") # Decode to string for display
except FileNotFoundError:
print(f"Error: File {file_name} not found.")
except gzip.BadGzipFile:
print(f"Error: File {file_name} is not a valid gzip file.")
except Exception as e:
print(f"An error occurred during decompression: {e}")
else:
print(f"Error: File {file_name} does not exist. Please run the compression example first.")
முக்கிய குறிப்புகள்:
'rb'
உடன் திறப்பது பைதான் இந்த கோப்பை, தரவு படிக்கப்படும் போது உடனடியாக நீக்கப்பட வேண்டிய ஒரு சுருக்கப்பட்ட கோப்பாகக் கருதச் சொல்கிறது.gz_file.read()
முழு நீக்கப்பட்ட உள்ளடக்கத்தையும் படிக்கிறது. மிக பெரிய கோப்புகளுக்கு, நீங்கள் மீண்டும் துண்டு துண்டாகப் பயன்படுத்தலாம்:while chunk := gz_file.read(4096): ...
.- அசல் தரவு UTF-8 குறியாக்கப்பட்ட உரை என்று கருதி, இதன் விளைவாக வரும் பைட்டுகளை காட்சிப்படுத்த ஒரு UTF-8 ஸ்ட்ரிங்காக நீக்குகிறோம்.
ஏற்கனவே உள்ள ஸ்ட்ரீமிற்கு தரவை நீக்குதல்
சுருக்கத்தைப் போலவே, நீங்கள் ஒரு gzip ஸ்ட்ரீமில் இருந்து தரவை நீக்கி, அதை ஒரு வழக்கமான கோப்பு அல்லது நெட்வொர்க் சாக்கெட் போன்ற மற்றொரு இலக்குக்கு எழுதலாம்.
import gzip
import io
import os
# Create a dummy compressed file for demonstration
original_content = b"Decompression test. This content will be compressed and then decompressed. " * 5000
compressed_file_for_decomp = "temp_compressed_for_decomp.gz"
with gzip.GzipFile(compressed_file_for_decomp, 'wb') as f_out:
f_out.write(original_content)
print(f"Created dummy compressed file: {compressed_file_for_decomp}")
output_file_path = "decompressed_output.txt"
try:
# Open the input gzip file in read binary mode
with gzip.GzipFile(compressed_file_for_decomp, 'rb') as f_in:
# Open the output file in write binary mode
with open(output_file_path, 'wb') as f_out:
# Read compressed data in chunks and write decompressed data
while True:
chunk = f_in.read(4096) # Reads decompressed data in chunks
if not chunk:
break
f_out.write(chunk)
print(f"Successfully decompressed {compressed_file_for_decomp} to {output_file_path}")
# Optional: Verify content integrity (for demonstration)
with open(output_file_path, 'rb') as f_verify:
read_content = f_verify.read()
if read_content == original_content:
print("Content verification successful: Decompressed data matches original.")
else:
print("Content verification failed: Decompressed data does NOT match original.")
except FileNotFoundError:
print(f"Error: Input file {compressed_file_for_decomp} not found.")
except gzip.BadGzipFile:
print(f"Error: Input file {compressed_file_for_decomp} is not a valid gzip file.")
except Exception as e:
print(f"An error occurred during decompression: {e}")
finally:
# Clean up dummy files
if os.path.exists(compressed_file_for_decomp):
os.remove(compressed_file_for_decomp)
if os.path.exists(output_file_path):
# os.remove(output_file_path) # Uncomment to remove the output file as well
pass
இந்த ஸ்ட்ரீமிங் நீக்குதலில்:
gzip.GzipFile(..., 'rb')
ஐப் பயன்படுத்தி மூல.gz
கோப்பைத் திறக்கிறோம்.- இலக்குக் கோப்பை (
output_file_path
) பைனரி எழுதும் முறையில் ('wb'
) திறக்கிறோம். f_in.read(4096)
அழைப்பு gzip ஸ்ட்ரீமில் இருந்து 4096 பைட்டுகள் *நீக்கப்பட்ட* தரவைப் படிக்கும்.- இந்த நீக்கப்பட்ட துண்டு பின்னர் வெளியீட்டுக் கோப்பிற்கு எழுதப்படுகிறது.
ஒரு நெட்வொர்க் சாக்கெட்டில் இருந்து தரவை நீக்குதல்
நெட்வொர்க் வழியாக Gzip சுருக்கப்பட்ட தரவைப் பெறும்போது, அது வரும்போது அதை நீக்கலாம்.
import gzip
import io
def decompress_and_process(socket_stream):
# Create an in-memory binary stream to hold compressed data
compressed_buffer = io.BytesIO()
# Read data from the socket in chunks and append to the buffer
# In a real app, this loop would continue until connection closes or EOF
print("Receiving compressed data...")
bytes_received = 0
while True:
try:
# Simulate receiving data from socket. Replace with actual socket.recv()
# For demo, let's generate some compressed data to simulate receipt
if bytes_received == 0: # First chunk
# Simulate sending a small compressed message
original_msg = b"Hello from the compressed stream! " * 50
buffer_for_compression = io.BytesIO()
with gzip.GzipFile(fileobj=buffer_for_compression, mode='wb') as gz_writer:
gz_writer.write(original_msg)
chunk_to_receive = buffer_for_compression.getvalue()
else:
chunk_to_receive = b""
if not chunk_to_receive:
print("No more data from socket.")
break
compressed_buffer.write(chunk_to_receive)
bytes_received += len(chunk_to_receive)
print(f"Received {len(chunk_to_receive)} bytes. Total received: {bytes_received}")
# In a real app, you might process partially if you have delimiters
# or know the expected size, but for simplicity here, we'll process after receiving all.
except Exception as e:
print(f"Error receiving data: {e}")
break
print("Finished receiving. Starting decompression...")
compressed_buffer.seek(0) # Rewind the buffer to read from the beginning
try:
# Wrap the buffer with gzip.GzipFile for decompression
with gzip.GzipFile(fileobj=compressed_buffer, mode='rb') as gz_reader:
# Read decompressed data
decompressed_data = gz_reader.read()
print("Decompression successful.")
print(f"Decompressed data: {decompressed_data.decode('utf-8')}")
# Process the decompressed_data here...
except gzip.BadGzipFile:
print("Error: Received data is not a valid gzip file.")
except Exception as e:
print(f"An error occurred during decompression: {e}")
# --- Mock setup for demonstration ---
# In a real scenario, 'socket_stream' would be a connected socket object
# For this demo, we'll pass our BytesIO buffer which simulates received data
# Simulate a socket stream that has received some compressed data
# (This part is tricky to mock perfectly without a full socket simulation,
# so the function itself simulates receiving and then processes)
decompress_and_process(None) # Pass None as the actual socket object is mocked internally for demo
இங்குள்ள உத்தி:
- நெட்வொர்க் சாக்கெட்டிலிருந்து தரவைப் பெற்று, அதை ஒரு நினைவகப் பப்பரில் (
io.BytesIO
) சேமிக்கவும். - எதிர்பார்க்கப்பட்ட அனைத்து தரவும் கிடைத்ததும் (அல்லது இணைப்பு மூடப்பட்டதும்), பப்பரை மீண்டும் சுற்றவும்.
- பப்பரை
gzip.GzipFile
உடன் பைனரி படிக்கும் முறையில் ('rb'
) மூடவும். - இந்த சுழலிலிருந்து நீக்கப்பட்ட தரவைப் படிக்கவும்.
குறிப்பு: நிகழ்நேர ஸ்ட்ரீமிங்கில், தரவு வரும்போது அதை நீக்கலாம், ஆனால் இது முழுமையற்ற gzip தொகுதிகளை நீக்க முயற்சிக்கவில்லை என்பதை உறுதிப்படுத்த மிகவும் சிக்கலான பப்பரிங் மற்றும் கையாளுதல் தேவைப்படுகிறது.
எளிமைக்காக gzip.open()
ஐப் பயன்படுத்துதல்
பல பொதுவான சூழ்நிலைகளுக்கு, குறிப்பாக கோப்புகளுடன் நேரடியாகக் கையாளும் போது, gzip.open()
பைதான் உள்ளமைக்கப்பட்ட open()
ஐப் போலவே மிகவும் சுருக்கமான தொடரியலை வழங்குகிறது.
gzip.open()
உடன் எழுதுதல் (சுருக்குதல்)
import gzip
output_filename = "simple_compressed.txt.gz"
content_to_write = "This is a simple text file being compressed using gzip.open().\n"
try:
# Open in text write mode ('wt') for automatic encoding/decoding
with gzip.open(output_filename, 'wt', encoding='utf-8') as f:
f.write(content_to_write)
f.write("Another line of text.")
print(f"Successfully wrote compressed data to {output_filename}")
except Exception as e:
print(f"An error occurred: {e}")
GzipFile
இலிருந்து முக்கிய வேறுபாடுகள்:
- நீங்கள் உரை முறையில் (
'wt'
) திறக்கலாம் மற்றும் ஒருencoding
ஐக் குறிப்பிடலாம், இது ஸ்ட்ரிங்குகளுடன் வேலை செய்வதை எளிதாக்குகிறது. - அடிப்படை சுருக்கம் தானாகவே கையாளப்படுகிறது.
gzip.open()
உடன் படித்தல் (நீக்குதல்)
import gzip
import os
input_filename = "simple_compressed.txt.gz"
if os.path.exists(input_filename):
try:
# Open in text read mode ('rt') for automatic decoding
with gzip.open(input_filename, 'rt', encoding='utf-8') as f:
read_content = f.read()
print(f"Successfully read decompressed data from {input_filename}")
print(f"Content: {read_content}")
except FileNotFoundError:
print(f"Error: File {input_filename} not found.")
except gzip.BadGzipFile:
print(f"Error: File {input_filename} is not a valid gzip file.")
except Exception as e:
print(f"An error occurred: {e}")
else:
print(f"Error: File {input_filename} does not exist. Please run the writing example first.")
finally:
# Clean up the created file
if os.path.exists(input_filename):
os.remove(input_filename)
'rt'
ஐப் பயன்படுத்துவது பைதான் UTF-8 நீக்குதலைக் கையாளுவதன் மூலம் நேரடியாக ஸ்ட்ரிங்குகளைப் படிக்க அனுமதிக்கிறது.
பைட் ஸ்ட்ரிங்கிற்கு gzip.compress()
மற்றும் gzip.decompress()
உங்கள் நினைவகத்தில் ஒரு பைட் ஸ்ட்ரிங் இருக்கும்போது மற்றும் கோப்புகள் அல்லது ஸ்ட்ரீம்களைக் கையாளாமல் அதைச் சுருக்க அல்லது நீக்க விரும்பும் எளிய நிகழ்வுகளுக்கு, gzip.compress()
மற்றும் gzip.decompress()
சிறந்தவை.
import gzip
original_bytes = b"This is a short string that will be compressed and decompressed in memory."
# Compress
compressed_bytes = gzip.compress(original_bytes)
print(f"Original size: {len(original_bytes)} bytes")
print(f"Compressed size: {len(compressed_bytes)} bytes")
# Decompress
decompressed_bytes = gzip.decompress(compressed_bytes)
print(f"Decompressed size: {len(decompressed_bytes)} bytes")
# Verify
print(f"Original equals decompressed: {original_bytes == decompressed_bytes}")
print(f"Decompressed content: {decompressed_bytes.decode('utf-8')}")
இந்த செயல்பாடுகள் நினைவகத்தில் சிறிய தரவுத் துண்டுகளைச் சுருக்க/நீக்குவதற்கான எளிய வழிகளாகும். அவை நினைவகச் சிக்கல்களை ஏற்படுத்தும் மிக பெரிய தரவுகளுக்கு ஏற்றவை அல்ல.
மேம்பட்ட விருப்பங்கள் மற்றும் பரிசீலனைகள்
gzip.GzipFile
கன்ஸ்ட்ரக்டர் மற்றும் gzip.open()
ஆகியவை சுருக்கம் மற்றும் கோப்பு கையாளுதலைப் பாதிக்கக்கூடிய கூடுதல் அளவுருக்களை ஏற்றுக்கொள்கின்றன:
compresslevel
: 0 முதல் 9 வரையிலான ஒரு முழு எண், சுருக்கத்தின் அளவைக் கட்டுப்படுத்துகிறது.0
என்பது சுருக்கம் இல்லை என்பதையும்,9
என்பது மெதுவான ஆனால் மிகவும் பயனுள்ள சுருக்கத்தையும் குறிக்கிறது. இயல்புநிலை பொதுவாக9
ஆகும்.mtime
: gzip கோப்பு தலைப்பில் சேமிக்கப்பட்டுள்ள மாற்றியமைக்கப்பட்ட நேரத்தைக் கட்டுப்படுத்துகிறது.None
என அமைக்கப்பட்டால், தற்போதைய நேரம் பயன்படுத்தப்படும்.filename
: அசல் கோப்பு பெயரை gzip தலைப்பில் சேமிக்க முடியும், இது சில பயன்பாடுகளுக்கு பயனுள்ளதாக இருக்கும்.fileobj
: ஏற்கனவே உள்ள ஒரு கோப்பு போன்ற பொருளைச் சுற்ற பயன்படுத்தப்படுகிறது.mode
: விவாதிக்கப்பட்டபடி, படிக்க/நீக்குவதற்கு'rb'
, எழுத/சுருக்க'wb'
.gzip.open()
உடன் உரை முறைகளுக்கு'rt'
மற்றும்'wt'
.encoding
:gzip.open()
உடன் உரை முறைகளைப் ('rt'
,'wt'
) பயன்படுத்தும் போது ஸ்ட்ரிங்குகள் எவ்வாறு பைட்டுகளாக மாற்றப்படுகின்றன மற்றும் நேர்மாறாக என்பதை குறிப்பிட இது முக்கியமானது.
சரியான சுருக்க அளவைத் தேர்ந்தெடுப்பது
compresslevel
அளவுரு (0-9) வேகம் மற்றும் கோப்பு அளவு குறைப்புக்கு இடையே ஒரு சமநிலையை வழங்குகிறது:
- நிலைகள் 0-3: வேகமான சுருக்கம், அளவில் குறைவான குறைப்பு. வேகம் முக்கியமானதாக இருக்கும் மற்றும் கோப்பு அளவு குறைவாக இருக்கும்போது ஏற்றது.
- நிலைகள் 4-6: சீரான அணுகுமுறை. நியாயமான வேகத்துடன் நல்ல சுருக்கம்.
- நிலைகள் 7-9: மெதுவான சுருக்கம், அதிகபட்ச அளவு குறைப்பு. சேமிப்பக இடம் குறைவாக இருக்கும்போது அல்லது அலைவரிசை மிக விலை உயர்ந்ததாக இருக்கும்போது மற்றும் சுருக்க நேரம் ஒரு bottleneck ஆக இல்லாதபோது ஏற்றது.
பெரும்பாலான பொது நோக்கப் பயன்பாடுகளுக்கு, இயல்புநிலை (நிலை 9) பெரும்பாலும் பொருத்தமானது. இருப்பினும், செயல்திறன் உணர்திறன் சூழ்நிலைகளில் (எ.கா., இணைய சேவையகங்களுக்கான நிகழ்நேர தரவு ஸ்ட்ரீமிங்), குறைந்த நிலைகளை முயற்சிப்பது பயனுள்ளதாக இருக்கும்.
பிழை கையாளுதல்: BadGzipFile
சாத்தியமான பிழைகளைக் கையாள்வது அவசியம். சிதைந்த அல்லது gzip அல்லாத கோப்புகளுடன் கையாளும் போது நீங்கள் சந்திக்கும் பொதுவான விதிவிலக்கு gzip.BadGzipFile
ஆகும். உங்கள் gzip செயல்பாடுகளை எப்போதும் try...except
தொகுதிகளில் மூடவும்.
மற்ற Gzip செயலாக்கங்களுடனான இணக்கத்தன்மை
பைதானின் gzip
தொகுதி நிலையான GNU zip பயன்பாட்டுடன் இணக்கமாக இருக்க வடிவமைக்கப்பட்டுள்ளது. இதன் பொருள் பைதானால் சுருக்கப்பட்ட கோப்புகளை gzip
கட்டளை-வரி கருவி மூலம் நீக்க முடியும், மற்றும் நேர்மாறாகவும். தரவு கையாளுதலுக்கு வெவ்வேறு கூறுகள் வெவ்வேறு கருவிகளைப் பயன்படுத்தக்கூடிய உலகளாவிய அமைப்புகளுக்கு இந்த இயங்குதிறன் முக்கியமானது.
பைதான் Gzip இன் உலகளாவிய பயன்பாடுகள்
பைதானின் gzip
தொகுதியின் திறமையான மற்றும் வலுவான தன்மை, பல உலகளாவிய பயன்பாடுகளுக்கு இது மிகவும் மதிப்புமிக்கதாக ஆக்குகிறது:
- இணைய சேவையகங்கள் மற்றும் APIகள்: HTTP பதில்களைச் சுருக்கி (எ.கா., HTTP Content-Encoding: gzip ஐப் பயன்படுத்தி) அலைவரிசை பயன்பாட்டைக் குறைத்து, உலகெங்கிலும் உள்ள பயனர்களுக்கு ஏற்றும் நேரத்தை மேம்படுத்துதல். Flask மற்றும் Django போன்ற கட்டமைப்புகள் இதை ஆதரிக்க உள்ளமைக்கப்படலாம்.
- தரவுச் சேமிப்பு மற்றும் காப்புப்பிரதி: பெரிய லாக் கோப்புகள், தரவுத்தள டம்ப்கள் அல்லது எந்த முக்கியமான தரவையும் சேமிப்பதற்கு முன் அதைச் சுருக்கி வட்டு இடத்தை மிச்சப்படுத்துதல் மற்றும் காப்புப்பிரதி நேரத்தைக் குறைத்தல். உலகளவில் செயல்படும் நிறுவனங்களுக்கு விரிவான தரவுச் சேமிப்பகத் தேவைகளுடன் இது முக்கியமானது.
- லாக் கோப்பு திரட்டுதல்: வெவ்வேறு பிராந்தியங்களில் அமைந்துள்ள சேவையகங்களைக் கொண்ட விநியோகிக்கப்பட்ட அமைப்புகளில், பதிவுகள் பெரும்பாலும் மையமாக சேகரிக்கப்படுகின்றன. பரிமாற்றத்திற்கு முன் இந்த பதிவுகளைச் சுருக்குவது நெட்வொர்க் போக்குவரத்துச் செலவுகளை கணிசமாகக் குறைத்து, உட்கொள்ளும் நேரத்தை விரைவுபடுத்துகிறது.
- தரவுப் பரிமாற்ற நெறிமுறைகள்: நம்பகத்தன்மையற்ற அல்லது குறைந்த அலைவரிசை நெட்வொர்க்குகளில் திறமையான தரவுப் பரிமாற்றம் தேவைப்படும் தனிப்பயன் நெறிமுறைகளைச் செயல்படுத்துதல். Gzip குறைந்த நேரத்தில் அதிக தரவு அனுப்பப்படுவதை உறுதிசெய்யும்.
- அறிவியல் கணிப்பீடு மற்றும் தரவு அறிவியல்: பெரிய தரவுத்தொகுப்புகளை (எ.கா., சென்சார் அளவீடுகள், உருவகப்படுத்துதல் வெளியீடுகள்)
.csv.gz
அல்லது.json.gz
போன்ற சுருக்கப்பட்ட வடிவங்களில் சேமிப்பது ஒரு நிலையான நடைமுறை. Pandas போன்ற நூலகங்கள் இவற்றை நேரடியாகப் படிக்க முடியும். - மேகக்கணி சேமிப்பகம் மற்றும் CDN ஒருங்கிணைப்பு: பல மேகக்கணி சேமிப்பக சேவைகள் மற்றும் உள்ளடக்க விநியோக நெட்வொர்க்குகள் (CDNs) உலகளவில் இறுதிப் பயனர்களுக்கு விநியோகச் செயல்திறனை மேம்படுத்த நிலையான சொத்துக்களுக்கு gzip சுருக்கத்தைப் பயன்படுத்துகின்றன.
- சர்வதேசமயமாக்கல் (i18n) மற்றும் உள்ளூர்மயமாக்கல் (l10n): மொழி கோப்புகளை நேரடியாகச் சுருக்கவில்லை என்றாலும், மொழிபெயர்ப்பு ஆதாரங்கள் அல்லது உள்ளமைவு கோப்புகளைப் பதிவிறக்குவதற்கான திறமையான தரவுப் பரிமாற்றம் gzip இலிருந்து பயனடைகிறது.
சர்வதேச பரிசீலனைகள்:
- அலைவரிசை மாறுபாடு: இணைய உள்கட்டமைப்பு பிராந்தியங்களுக்கு இடையில் கணிசமாக வேறுபடுகிறது. குறைந்த அலைவரிசை உள்ள பகுதிகளில் பயனர்களுக்கு ஏற்றுக்கொள்ளக்கூடிய செயல்திறனை உறுதிப்படுத்த Gzip அவசியம்.
- தரவு இறையாண்மை மற்றும் சேமிப்பகம்: சுருக்கம் மூலம் தரவு அளவைக் குறைப்பது சேமிப்பக செலவுகளை நிர்வகிக்கவும், தரவு அளவு மற்றும் தக்கவைப்பு தொடர்பான விதிமுறைகளுக்கு இணங்கவும் உதவும்.
- நேர மண்டலங்கள் மற்றும் செயலாக்கம்: gzip உடனான ஸ்ட்ரீம் செயலாக்கம் பல நேர மண்டலங்களில் உருவாக்கப்பட்ட தரவை எந்த ஒரு இடத்திலும் செயலாக்கம் அல்லது சேமிப்பக ஆதாரங்களை அதிகமாகச் செலுத்தாமல் திறமையாகக் கையாள அனுமதிக்கிறது.
- நாணயம் மற்றும் செலவு: குறைக்கப்பட்ட தரவுப் பரிமாற்றம் நேரடியாக குறைந்த அலைவரிசை செலவுகளாக மாற்றப்படுகிறது, இது உலகளாவிய செயல்பாடுகளுக்கு ஒரு முக்கிய காரணியாகும்.
பைதான் Gzip ஐப் பயன்படுத்துவதற்கான சிறந்த நடைமுறைகள்
with
கூற்றுகளைப் பயன்படுத்தவும்: கோப்புகள் சரியாக மூடப்பட்டு ஆதாரங்கள் விடுவிக்கப்படுவதை உறுதிசெய்ய எப்போதும்with gzip.GzipFile(...)
அல்லதுwith gzip.open(...)
ஐப் பயன்படுத்தவும்.- பைட்டுகளைக் கையாளவும்: gzip பைட்டுகளில் செயல்படுகிறது என்பதை நினைவில் கொள்ளுங்கள். ஸ்ட்ரிங்குகளுடன் வேலை செய்தால், சுருக்கத்திற்கு முன் அவற்றை பைட்டுகளாக குறியாக்கம் செய்யவும், நீக்குதலுக்குப் பிறகு அவற்றை நீக்க குறியாக்கம் செய்யவும். உரை முறைகளுடன்
gzip.open()
இதை எளிதாக்குகிறது. - பெரிய தரவை ஸ்ட்ரீம் செய்யவும்: கிடைக்கக்கூடிய நினைவகத்தை விட பெரிய கோப்புகளுக்கு, முழு தரவுத்தொகுப்பையும் ஏற்ற முயற்சிக்காமல் எப்போதும் துண்டுகளாகப் (சிறிய தொகுதிகளில் படிப்பதும் எழுதுவதும்) பயன்படுத்தவும்.
- பிழை கையாளுதல்: குறிப்பாக
gzip.BadGzipFile
க்கு வலுவான பிழை கையாளுதலைச் செயல்படுத்தவும், மேலும் ஸ்ட்ரீமிங் பயன்பாடுகளுக்கான நெட்வொர்க் பிழைகளையும் கருத்தில் கொள்ளவும். - பொருத்தமான சுருக்க அளவைத் தேர்ந்தெடுக்கவும்: சுருக்க விகிதத்தை செயல்திறன் தேவைகளுடன் சமநிலைப்படுத்தவும். செயல்திறன் முக்கியமானதாக இருந்தால் பரிசோதனை செய்யவும்.
.gz
நீட்டிப்பைப் பயன்படுத்தவும்: தொகுதியால் கண்டிப்பாகத் தேவைப்படாவிட்டாலும்,.gz
நீட்டிப்பைப் பயன்படுத்துவது gzip-சுருக்கப்பட்ட கோப்புகளை அடையாளம் காண உதவும் ஒரு நிலையான மரபாகும்.- உரை Vs. பைனரி: மூல பைட் ஸ்ட்ரீம்களுக்கு பைனரி முறைகளை (
'rb'
,'wb'
) எப்போது பயன்படுத்த வேண்டும் மற்றும் ஸ்ட்ரிங்குகளுடன் கையாளும் போது உரை முறைகளை ('rt'
,'wt'
) எப்போது பயன்படுத்த வேண்டும் என்பதைப் புரிந்து கொள்ளுங்கள், சரியான குறியாக்கத்தை நீங்கள் குறிப்பிடுவதை உறுதிசெய்கிறீர்கள்.
முடிவுரை
பைதானின் gzip
தொகுதி எந்தவொரு திறனிலும் தரவுகளுடன் பணிபுரியும் டெவலப்பர்களுக்கு ஒரு தவிர்க்க முடியாத கருவியாகும். தரவுப் பரிமாற்றம், சேமிப்பகம் மற்றும் செயலாக்கம் ஆகியவற்றைக் கையாளும் பயன்பாடுகளை மேம்படுத்துவதற்கு, குறிப்பாக உலகளாவிய அளவில், திறம்பட ஸ்ட்ரீம் சுருக்கம் மற்றும் நீக்குதலைச் செய்யும் அதன் திறன் ஒரு மூலக்கல்லாக அமைகிறது. gzip.GzipFile
, gzip.open()
மற்றும் பயன்பாட்டு செயல்பாடுகளின் நுணுக்கங்களைப் புரிந்துகொள்வதன் மூலம், உங்கள் பைதான் பயன்பாடுகளின் செயல்திறனை கணிசமாக மேம்படுத்தலாம் மற்றும் வளங்களின் பயன்பாட்டைக் குறைக்கலாம், இது ஒரு சர்வதேச பார்வையாளர்களின் பல்வேறு தேவைகளைப் பூர்த்தி செய்யும்.
நீங்கள் அதிக போக்குவரத்து கொண்ட இணைய சேவையை உருவாக்கினாலும், அறிவியல் ஆராய்ச்சிக்கான பெரிய தரவுத்தொகுப்புகளை நிர்வகித்தாலும், அல்லது உள்ளூர் கோப்புச் சேமிப்பகத்தை மேம்படுத்தினாலும், பைதானின் gzip
தொகுதியுடன் ஸ்ட்ரீம் சுருக்கம் மற்றும் நீக்குதல் கோட்பாடுகள் உங்களுக்கு நன்றாக சேவை செய்யும். உலகளாவிய டிஜிட்டல் சூழலுக்கான மிகவும் திறமையான, அளவிடக்கூடிய மற்றும் செலவு குறைந்த தீர்வுகளை உருவாக்க இந்த கருவிகளைப் பயன்படுத்துங்கள்.